Object Cloning একটি প্রক্রিয়া যেখানে একটি অবজেক্টের একটি নির্দিষ্ট কপি তৈরি করা হয়। ক্লোনিং এমন একটি প্রক্রিয়া, যা Java তে clone() মেথডের মাধ্যমে করা হয়, তবে একটি অবজেক্ট ক্লোন করতে হলে সেই ক্লাসকে Cloneable ইন্টারফেস ইমপ্লিমেন্ট করতে হবে। Java তে, অবজেক্ট ক্লোন করার জন্য একটি সহজ পদ্ধতি প্রদান করে যা অবজেক্টের একটি শ্যালো কপি (shallow copy) বা ডিপ কপি (deep copy) তৈরি করতে পারে।
Object Cloning এর প্রয়োজনীয়তা:
- অবজেক্টের কপি তৈরি করা: ক্লোনিং অবজেক্টের নতুন কপি তৈরি করার জন্য ব্যবহৃত হয় যাতে মূল অবজেক্টের উপর কোনো পরিবর্তন না হয়। এটি বিভিন্ন অ্যাপ্লিকেশন তৈরি করার সময় দরকারী, যেখানে একই অবজেক্টের একাধিক কপি ব্যবহৃত হতে পারে, যেমন গেমস, গ্রাফিক্স, বা ডেটাবেস ইন্টারঅ্যাকশন।
- শ্যালো কপি এবং ডিপ কপি: ক্লোনিং পদ্ধতি দুটি প্রধান ধরনের কপি তৈরি করতে সাহায্য করে:
- শ্যালো কপি (Shallow Copy): অবজেক্টের ভিতরের রেফারেন্স ভ্যালুগুলি কপি করা হয়, কিন্তু আসল ডেটা পরিবর্তিত হলে ক্লোনড অবজেক্টও পরিবর্তিত হয়।
- ডিপ কপি (Deep Copy): অবজেক্টের মধ্যে থাকা সমস্ত ডেটা এবং রেফারেন্সও কপি করা হয়, যাতে মূল এবং ক্লোনড অবজেক্ট একে অপরের সাথে কোনো সম্পর্ক না রাখে।
- পেরফরম্যান্স বৃদ্ধি: অনেক ক্ষেত্রে, অবজেক্ট ক্লোন করে তার কপি তৈরি করা অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করতে পারে, যেমন ডেটা ম্যানিপুলেশন বা রেন্ডারিং প্রক্রিয়া দ্রুত করতে।
Cloneable ইন্টারফেস এবং clone() মেথডের ব্যবহার:
Cloneable ইন্টারফেস এবং clone() মেথড Java-তে একটি ক্লাসের অবজেক্ট ক্লোন করতে ব্যবহৃত হয়। তবে, clone() মেথডটি Object ক্লাসের একটি মেথড, যা শুধুমাত্র তখন কাজ করে যখন ক্লাসটি Cloneable ইন্টারফেস ইমপ্লিমেন্ট করে।
Cloneable ইন্টারফেস:
Cloneableএকটি মার্কার ইন্টারফেস (marker interface), যার মানে এটি কোনো মেথড ডিফাইন করে না। এটি শুধুমাত্র ক্লাসকে ক্লোন করার জন্য সক্ষম করে তোলে।- যখন কোনো ক্লাস
Cloneableইন্টারফেস ইমপ্লিমেন্ট করে, তখন এটিclone()মেথড ব্যবহার করে নিজেকে ক্লোন করতে পারে।
clone() মেথড:
clone()মেথডটিObjectক্লাস থেকে ইনহেরিট করা হয়, এবং এটি একটি শ্যালো কপি তৈরি করে।clone()মেথডটিCloneNotSupportedExceptionথ্রো করতে পারে যদি ক্লাসটিCloneableইন্টারফেস ইমপ্লিমেন্ট না করে।
clone() মেথডের ব্যবহার:
- শ্যালো কপি (Shallow Copy): যখন একটি ক্লাসের
clone()মেথড ব্যবহার করে ক্লোন করা হয়, তখন এটি মূল অবজেক্টের কপি তৈরি করে, কিন্তু অবজেক্টের ভিতরে থাকা রেফারেন্স ভ্যালুগুলির কপি তৈরি করে না। অর্থাৎ, যদি ক্লোনড অবজেক্টে কোনো পরিবর্তন করা হয়, তবে মূল অবজেক্টেও তা প্রতিফলিত হতে পারে। - ডিপ কপি (Deep Copy):
clone()মেথড সাধারণত শ্যালো কপি তৈরি করে, তবে আপনি চাইলেclone()মেথডের মধ্যে নিজস্ব কোড লিখে ডিপ কপি তৈরি করতে পারেন, যেখানে নেস্টেড অবজেক্টগুলির কপি করা হয়।
উদাহরণ:
Cloneable ইন্টারফেস এবং clone() মেথড ব্যবহার:
class Person implements Cloneable {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // শ্যালো কপি তৈরি
}
@Override
public String toString() {
return "Person[name=" + name + ", age=" + age + "]";
}
}
public class CloneExample {
public static void main(String[] args) {
try {
Person person1 = new Person("Alice", 30);
Person person2 = (Person) person1.clone(); // ক্লোন করা
System.out.println(person1); // Output: Person[name=Alice, age=30]
System.out.println(person2); // Output: Person[name=Alice, age=30]
// Modifying cloned object
person2.name = "Bob";
person2.age = 25;
System.out.println(person1); // Output: Person[name=Alice, age=30]
System.out.println(person2); // Output: Person[name=Bob, age=25]
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
আউটপুট:
Person[name=Alice, age=30]
Person[name=Alice, age=30]
Person[name=Alice, age=30]
Person[name=Bob, age=25]
এখানে, Person ক্লাস Cloneable ইন্টারফেস ইমপ্লিমেন্ট করেছে, এবং clone() মেথডে super.clone() ব্যবহার করা হয়েছে যাতে একটি শ্যালো কপি তৈরি করা যায়। পরে, person2 এর কিছু মান পরিবর্তন করা হয়েছে, এবং person1 অবজেক্ট অপরিবর্তিত রয়ে গেছে।
ডিপ কপি উদাহরণ:
class Address {
String city;
public Address(String city) {
this.city = city;
}
@Override
public String toString() {
return city;
}
}
class Person implements Cloneable {
String name;
Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Person cloned = (Person) super.clone();
cloned.address = new Address(this.address.city); // Deep copy for address
return cloned;
}
@Override
public String toString() {
return "Person[name=" + name + ", address=" + address + "]";
}
}
public class DeepCloneExample {
public static void main(String[] args) {
try {
Address address = new Address("New York");
Person person1 = new Person("Alice", address);
Person person2 = (Person) person1.clone(); // Creating deep copy
System.out.println(person1); // Output: Person[name=Alice, address=New York]
System.out.println(person2); // Output: Person[name=Alice, address=New York]
// Modifying address in cloned object
person2.address.city = "Los Angeles";
System.out.println(person1); // Output: Person[name=Alice, address=New York]
System.out.println(person2); // Output: Person[name=Alice, address=Los Angeles]
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
আউটপুট:
Person[name=Alice, address=New York]
Person[name=Alice, address=New York]
Person[name=Alice, address=New York]
Person[name=Alice, address=Los Angeles]
এখানে, address অবজেক্টটি Person ক্লাসের মধ্যে রয়েছে, তাই এটি ডিপ কপি করতে clone() মেথডের মধ্যে address অবজেক্টের কপি তৈরি করা হয়েছে। এর ফলে, যখন person2 এর ঠিকানা পরিবর্তন করা হয়, তখন person1 এর ঠিকানা অপরিবর্তিত থাকে।
- Object Cloning Java-তে একটি অবজেক্টের কপি তৈরি করার একটি প্রক্রিয়া। এটি
Cloneableইন্টারফেস ইমপ্লিমেন্ট এবংclone()মেথডের মাধ্যমে করা হয়। - Shallow Copy এবং Deep Copy দুটি প্রধান প্রকারের ক্লোনিং, যেখানে shallow copy শুধুমাত্র রেফারেন্স কপি করে, এবং deep copy সমস্ত ডেটার কপি তৈরি করে।
- Cloneable ইন্টারফেসের মাধ্যমে ক্লোনিং সক্ষম করা হয় এবং clone() মেথডটি ব্যবহৃত হয় অবজেক্ট ক্লোন করার জন্য।
Read more